import open3d as o3d
# 体素化是将连续的3D点云数据转换为离散的3D体素格网的过程。具体来说:
# 首先,我们会定义一个3D空间网格,每个网格单元称为一个体素(Voxel)。体素的大小由分辨率决定,分辨率越高,体素越小。
# 然后,我们会将点云数据中的每个点映射到对应的体素网格中。如果一个体素内有多个点,通常会用平均值或中值等方法来表示该体素的属性。
# 通过这个过程,原本连续的点云数据被离散化为一个个独立的体素。每个体素都有自己的位置坐标和属性值(如颜色、法线等)。
# 体素化的主要作用包括:
# 数据压缩和简化。将大量的点云数据压缩成更小的体素格网,便于存储和处理。
# 空间索引和查找。体素格网可以用于快速检索和查找感兴趣的区域。
# 特征提取。体素属性可用于提取几何特征,如平面、边缘等。
# 数据可视化。体素格网可以直接用于3D渲染和可视化。

# 1. 读取点云数据（PCD 格式）
pcd = o3d.io.read_point_cloud("../datasets/standford_cloud_data/China dragon.pcd")

# 2. 可视化原始点云
o3d.visualization.draw_geometries([pcd], window_name="原始点云", width=800, height=600)

# 3. 设置体素大小
voxel_size = 0.001  # 体素的边长，可以根据需要调整

# 4. 执行体素化
voxel_grid = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, voxel_size)

# 5. 可视化体素化结果
o3d.visualization.draw_geometries([voxel_grid], window_name="体素化结果", width=800, height=600)
